package com.gtw.handler;

/**
 * 责任链模式核心在"链"上,是由多个ConcreteHandler组成
 * 抽象Handler三个职责:
 *      1.设置下一个处理者;
 *      2.定义具体处理者必须实现的两个方法:设置自己能处理的等级和具体的处理任务逻辑
 *      3.定义唯一对外开放的方法,请求处理的方法handleMessage
 * 优点:
 *      将请求和处理进行分开,请求者不用知道是谁处理的,处理者不用知道请求的全貌(单一职责原则、迪米特法则)
 * 缺点:
 *      因为是链式结构,性能是最大问题,而且调试很不方便
 * 注意事项:
 *      要注意链的长度,最好设定一个阈值,setNext()不允许超过最大值
 */
public abstract class Handler {
    private Handler nextHandler;

    //每个处理者都有一个处理级别
    protected abstract int getHandlerLevel();
    //每个处理者必须实现处理业务
    protected abstract void echo(Request request);
    //设置下一个处理者是谁
    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    //此为模板方法
    public final void handleMessage(Request request){
        if(this.getHandlerLevel() == request.getLevel()){
            this.echo(request);
        }else {
            if(nextHandler != null){
                nextHandler.handleMessage(request);
            }else {
                System.out.println("没有处理者。。。");
            }
        }
    }
}
